" Uncomment the next line to make Vim more Vi-compatible
" NOTE: debian.vim sets 'nocompatible'. Setting 'compatible' changes numerous
" options, so any other options should be set AFTER setting 'compatible'.
set nocompatible


" Vim5 and later versions support syntax highlighting. Uncommenting the
" following enables syntax highlighting by default.
if has("syntax")
syntax on " 语法高亮
endif
colorscheme desert " elflord ron peachpuff default 设置配色方案
" vim自带的配色方案保存在/usr/share/vim/vim72/colors目录下


" detect file type
filetype on
filetype plugin on


" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
" set background=dark


" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
"have Vim load indentation rules and plugins according to the detected filetype
filetype plugin indent on
endif





" The following are commented out as they cause vim to behave a lot
" differently from regular Vi. They are highly recommended though.
set ignorecase " 搜索模式里忽略大小写
set smartcase " 如果搜索模式包含大写字符，不使用 'ignorecase' 选项。只有在输入搜索模式并且打开 'ignorecase' 选项时才会使用。
set autowrite " 自动把内容写回文件: 如果文件被修改过，在每个 :next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令时进行；用 :buffer、CTRL-O、CTRL-I、'{A-Z0-9} 或 `{A-Z0-9} 命令转到别的文件时亦然。
set autoindent " 设置自动对齐(缩进)：即每行的缩进值与上一行相等；使用 noautoindent 取消设置
set smartindent " 智能对齐方式
set tabstop=4 " 设置制表符(tab键)的宽度
set softtabstop=4 " 设置软制表符的宽度 
set shiftwidth=4 " (自动) 缩进使用的4个空格
set cindent " 使用 C/C++ 语言的自动缩进方式
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s "设置C/C++语言的具体缩进方式
"set backspace=2 " 设置退格键可用
set showmatch " 设置匹配模式，显示匹配的括号
set linebreak " 整词换行
set whichwrap=b,s,<,>,[,] " 光标从行首和行末时可以跳到另一行去
"set hidden " Hide buffers when they are abandoned
set mouse=a " Enable mouse usage (all modes) "使用鼠标
set number " Enable line number "显示行号 
"set previewwindow " 标识预览窗口 
set history=50 
" set command history to 50 "历史记录50条 


"--状态行设置-- 
set laststatus=2 " 总显示最后一个窗口的状态行；设为1则窗口数多于一个的时候显示最后一个窗口的状态行；0不显示最后一个窗口的状态行 
set ruler " 标尺，用于显示光标位置的行号和列号，逗号分隔。每个窗口都有自己的标尺。如果窗口有状态行，标尺在那里显示。否则，它显示在屏幕的最后一行上。 


"--命令行设置-- 
set showcmd " 命令行显示输入的命令 
set showmode " 命令行显示vim当前模式 
"--find setting-- 
set incsearch " 输入字符串就显示匹配点 
set hlsearch







"--ctags setting--
" 按下F5重新生成tag文件，并更新taglist
map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
set tags=tags
set tags+=./tags "add current directory's generated tags file
set tags+=../tags 
set tags+=../../tags 
set tags+=/usr/src/linux-headers-4.10.0-28/tags "add new tags file
" 在linux内核源码文件夹下 ctags -R * 生成的tags文件
" (在ctags -R 生成tags文件后，不要将tags移动到别的目录，否则ctrl+］时，会提示找不到源码文件)
" tags的用法：
" Ctrl＋］  跳到当前光标下单词的标签
" Ctrl＋O  返回上一个标签
" Ctrl＋T  返回上一个标签
" :tag TagName 跳到TagName标签
" :stag TagName 新窗口显示TagName标签，光标跳到标签处
" Ctrl＋W + ］  新窗口显示当前光标下单词的标签，光标跳到标签处
" 如果一个标签存在多个匹配，则可以使用
" :tfirst    到第一个匹配
" :[count]tprevious 向前 [count] 个匹配
" :[count]tnext  向后 [count] 个匹配
" :tlast    到最后一个匹配
" 或者使用以下命令选择要跳转到哪一个
" :tselect TagName
" 以下命令将在预览窗口显示标签
" :ptag TagName 预览窗口显示TagName标签，光标跳到标签处
" Ctrl＋W + }  预览窗口显示当前光标下单词的标签，光标跳到标签处
" :pclose   关闭预览窗口
" :pedit file.h 在预览窗口中编辑文件file.h（在编辑头文件时很有用）
" :psearch atoi 查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配，在使用没有标签文件的库函数时十分有用。 





"-- omnicppcomplete setting --
" 按下F3自动补全代码，注意该映射语句后不能有其他字符，包括tab；否则按下F3会自动补全一些乱码
imap <F3> <C-X><C-O>
" 按下F2根据头文件内关键字补全
imap <F2> <C-X><C-I>
" 对于C++，可能需要添加namespace std才能找到所需的tag
set completeopt=menu,menuone " 关掉智能补全时的预览窗口
let OmniCpp_MayCompleteDot = 1 " autocomplete with .
let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
"let OmniCpp_DefaultNamespaces=["std"]
let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
let OmniCpp_ShowAccess=1 
" OmniCppComplete 是基于ctags数据库即tags文件实现的(基于ctags生成的索引信息来实现自动补全的)
" 所以在ctags -R生成tags时还需要一些额外的选项，这样生成的tags文件才能与OmniCppComplete配合运作。
" 使用下列命令生成tags文件，就可以 与OmniCppComplete配合运作：
" ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
" --c++-kinds=+p  : 为C++文件增加函数原型的标签
" --fields=+iaS   : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
" --extra=+q      : 为标签增加类修饰符。注意，如果没有此选项，将不能对类成员补全


" 首先sudo apt-get install build-essential
" 然后进入 cd /usr/include/c++
" ctags -R --c++-kinds=+p --fields=+iaS --extra=+q
" 添加该生成的tags到搜索路径中
set tags+=/usr/include/c++/tags

" 其他快捷键
" Ctrl+P  向前切换成员
" Ctrl+N  向后切换成员
" Ctrl+E  表示退出下拉窗口, 并退回到原来录入的文字
" Ctrl+Y  表示退出下拉窗口, 并接受当前选项
" 其他补全方式:
" Ctrl+X Ctrl+L  整行补全
" Ctrl+X Ctrl+N  根据当前文件里关键字补全
" Ctrl+X Ctrl+K  根据字典补全
" Ctrl+X Ctrl+T  根据同义词字典补全
" Ctrl+X Ctrl+I  根据头文件内关键字补全
" Ctrl+X Ctrl+]  根据标签补全
" Ctrl+X Ctrl+F  补全文件名
" Ctrl+X Ctrl+D  补全宏定义
" Ctrl+X Ctrl+V  补全vim命令
" Ctrl+X Ctrl+U  用户自定义补全方式
" Ctrl+X Ctrl+S  拼写建议
" 帮助文档
" :help omnicppcomplete






" 提示函数原型echofunc
" echofunc可以在命令行中提示当前输入函数的原型。
" echofunc下载地址：http://www.vim.org/scripts/script.php?script_id=1735
" 下载完成后 mv echofunc.vim ~/.vim/plugin/
" 以后，当编程时，函数名输入完成后，输入(，在窗口底部就会显示函数原型





" 标签浏览器Taglist
" 安装命令：vim-addons install taglist
"-- Taglist setting --
let Tlist_Ctags_Cmd='ctags' "因为我们放在环境变量里，所以可以直接执行
let Tlist_Use_Right_Window=1 "让窗口显示在右边，0的话就是显示在左边
let Tlist_Show_One_File=0 "让taglist可以同时展示多个文件的函数列表
let Tlist_File_Fold_Auto_Close=1 "非当前文件，函数列表折叠隐藏
let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时，自动退出vim
"是否一直处理tags 1:处理;0:不处理
let Tlist_Process_File_Always=1 "实时更新tags
let Tlist_Inc_Winwidth=0

" 进入vim后用命令":Tlist"打开/关闭taglist窗口
nmap tl :Tlist<cr> "tl快捷打开
" 帮助文档
" :help taglist.txt





" 文件浏览器和缓冲区管理器WinManager
" 安装命令 vim-addons install winmanager
"-- WinManager setting --
let g:winManagerWindowLayout='FileExplorer|TagList' " 设置我们要管理的插件
"let g:persistentBehaviour=0 " 如果所有编辑文件都关闭了，退出vim
" 映射wm为VMToggle命令
nmap wm :WMToggle<cr> 
" 常用命令
" :WMToggle 打开/关闭WinManage，不过我们在配置文件.vimrc中做了快捷键映射，所以直接按wm就可以打开/关闭WinManage
" <enter>或双击  如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件
" <tab>   如果光标下是目录, 则进入该目录; 如果光标下文件, 则在新窗口打开该文件
" <F5> 刷新列表
" -  返回上一层目录
" c  使浏览目录成为vim当前工作目录
" d  创建目录
" D  删除当前光标下的目录或文件
" i  切换显示方式
" R  文件或目录重命名
" s  选择排序方式
" r  反向排序列表
" x  定制浏览方式, 使用你指定的程序打开该文件
" winmanager帮助文档
" :help winmanager
" netrw帮助文档
" :help netrw





" buffer管理器MiniBufferExplorer
" 安装MiniBufferExplorer
" vim-addons install minibufexplorer
" -- MiniBufferExplorer --
let g:miniBufExplMapWindowNavVim = 1 " 按下Ctrl+h/j/k/l，可以切换到当前窗口的上下左右窗口
let g:miniBufExplMapWindowNavArrows = 1 " 按下Ctrl+箭头，可以切换到当前窗口的上下左右窗口
let g:miniBufExplMapCTabSwitchBufs = 1 " 启用以下两个功能：Ctrl+tab移到下一个buffer并在当前窗口打开；Ctrl+Shift+tab移到上一个buffer并在当前窗口打开；ubuntu好像不支持
"let g:miniBufExplMapCTabSwitchWindows = 1 " 启用以下两个功能：Ctrl+tab移到下一个窗口；Ctrl+Shift+tab移到上一个窗口；ubuntu好像不支持
let g:miniBufExplModSelTarget = 1 " 不要在不可编辑内容的窗口（如TagList窗口）中打开选中的buffer
" 常用命令
" <Tab>  移到上一个buffer
" <Shift-Tab> 移到下一个buffer
" <Enter>  打开光标所在的buffer
" d   删除光标所在的buffer


" 以上插件会打开多个窗口
" vim窗口管理命令如下：
" :new fileName 新窗口下打开或者创建（如果不存在）一个文件
" :split fileName 纵向切割窗口，打开新文件。缩写形式为： sp fileName
" :vsplit fileName 横向切割窗口，打开新文件。缩写形式为： vsp fileName
" :qa 退出所有窗口
" 在多个窗口中切换
" 先按 Ctrl+w，然后 上下左右键向指定方向切换













" 代码折叠
" 折叠方式foldmethod
" vim提供以下6种方法来选定折叠方式：
" manual 手工定义折叠
" indent 更多的缩进表示更高级别的折叠
" expr 用表达式来定义折叠
" syntax 用语法高亮来定义折叠
" diff 对没有更改的文本进行折叠
" marker 对文中的标志折叠
"--fold setting--
set foldmethod=syntax " 用语法高亮来定义折叠
set foldlevel=100 " 启动vim时不要自动折叠代码
set foldcolumn=5 " 设置折叠栏宽度

" 常用命令
" za  打开/关闭在光标下的折叠
" zA  循环地打开/关闭光标下的折叠
" zo  打开 (open) 在光标下的折叠
" zO  循环打开 (Open) 光标下的折叠
" zc  关闭 (close) 在光标下的折叠
" zC  循环关闭 (Close) 在光标下的所有折叠
" zM  关闭所有折叠
" zR  打开所有的折叠
" 帮助文档
" :help usr_28.txt
" :help fold.txt





" 项目目录数管理器Project
" 不知道是啥，暂时不用
" 安装命令：vim-addons install project 





" quickfix命令集
" 通过quickfix命令集，你可在 Vim 内编译程序并直接跳转到出错位置进行修正。你可以接着重新编译并做修正，直到不再出错为止。
"-- QuickFix setting --
" 按下F6，执行make clean
map <F6> :make clean<CR><CR><CR>
" 按下F7，执行make编译程序，并打开quickfix窗口，显示编译信息
map <F7> :make<CR><CR><CR> :copen<CR><CR>
" 按下F8，光标移到上一个错误所在的行
map <F8> :cp<CR>
" 按下F9，光标移到下一个错误所在的行
map <F9> :cn<CR>
" 以上的映射是使上面的快捷键在插入模式下也能用
imap <F6> <ESC>:make clean<CR><CR><CR>
imap <F7> <ESC>:make<CR><CR><CR> :copen<CR><CR>
imap <F8> <ESC>:cp<CR>
imap <F9> <ESC>:cn<CR>

" 帮助文档
" :help usr_30
" :help quickfix
" 手动make方式为 :make {arguments}
" 如果编译时出现错误，按 <Enter>，回到vim界面，看不到出错信息了！这时，可以运行以下命令
" :cw[indow]
" 打开quickfix窗口来查看出错信息，它会自动跳到第一处出错的地方。然后，你可以双击出错某一条出错信息，vim就会自动跳转到相应的出错位置
" :cn[ext]  光标移到下一个错误所在的行
" :cp[revious] 光标移到上一个错误所在的行
" :cfirst  到第一处错误
" :clast  到最后一处错误
" :cc   空间不够时，Vim 会缩短出错信息。如果你想查看详细信息，可以使用此命令
" :cl[ist] 列出所有出错信息的概览（只有那些含有文件名或行数的错误信息会被显示，需要查看那些并不含文件名或行数的信息可用“:cl[ist]!”命令）





" Cscope 类似于ctags的工具，不过其功能比ctags强大很多
" 安装命令 sudo apt-get install cscope
"-- Cscope setting --
if has("cscope")
set csprg=/usr/bin/cscope " 指定用来执行cscope的命令
set csto=0 " 设置cstag命令查找次序：0先找cscope数据库再找标签文件；1先找标签文件再找cscope数据库
set cst " 同时搜索cscope数据库和标签文件
set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用QuickFix窗口来显示cscope查找结果
set nocsverb
if filereadable("cscope.out") " 若当前目录下存在cscope数据库，添加该数据库到vim
cs add cscope.out
elseif $CSCOPE_DB != "" " 否则只要环境变量CSCOPE_DB不为空，则添加其指定的数据库到vim
cs add $CSCOPE_DB
endif
set csverb
endif
map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
" 将:cs find c等Cscope查找命令映射为<C-_>c等快捷键（按法是先按Ctrl+Shift+-, 然后很快再按下c）
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR> nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR> nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR> nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR> nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR> :copen<CR><CR>

" cscope的主要功能是通过其"find"子命令来实现的
" "cscope find"的用法:
" cs find c|d|e|f|g|i|s|t name
" 0 或 s  查找这个 C 符号(可以跳过注释)
" 1 或 g  查找这个定义
" 2 或 d  查找这个函数调用的函数
" 3 或 c  查找调用过这个函数的函数
" 4 或 t  查找这个字符串
" 6 或 e  查找这个 egrep 模式
" 7 或 f  查找这个文件
" 8 或 i  查找包含这个文件的文件
" 现在不需要cscope这么高级的插件，不知道这个是啥
" 等以后知道了再用，用法如下
" <1>、为源码建立一个cscope数据库
" lingd@ubuntu:~/arm/linux-2.6.28.7$ cscope -Rbq
" lingd@ubuntu:~/arm/linux-2.6.28.7$ ls cscope.*
" cscope.in.out  cscope.out  cscope.po.out
" <2>、 用vim打开某个源码文件，末行模式下，输入“:cs add cscope.out"（该命令已被我们映射为快捷键F4），添加cscope数据库到vim。
" 因为我们已将vim配置为启动时，自动添加当前目录下的 cscope数据库，所以你再添加该cscope数据库时，vim会提示“重复cscope数据库 未被加入“
" <3>、完成前两步 后，现在就可以用“cs find c”等Cscope查找命令查找关键字了。
" 我们已在.vimrc中将“cs find c”等Cscope查找命令映射为<C-_>c等快捷键（按法是先按Ctrl+Shift+-, 然后很快按下c）





" vim常用快捷键
" %  跳转到配对的括号去
" [[  跳转到当前或者上一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行)
" ][  跳转到当前代码块(函数定义、类定义等)的结尾去(但要求代码块中'{'必须单独占一行)
" ]]  跳转到下一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行)
" [/  跳到注释开头（只对/* */注释有效）
" ]/ 跳到注释结尾（只对/* */注释有效）
" gD  跳转到当前文件内标识符首次出现的位置，可用于跳转到全部变量的定义处；查找局部变量时，要是多个函数中定义了该局部变量，使用gD进行查找，找到的变量定义可能不是你需要的
" gd 跳转到当前函数内标识符首次出现的位置，可用于跳转到局部变量的定义处
" ''  跳转到光标上次停靠的地方, 是两个', 而不是一个"
" mx  设置书签,x只能是a-z的26个字母
" `x  跳转到书签处("`"是1左边的键)
" >  增加缩进,"x>"表示增加以下x行的缩进
" <  减少缩进,"x<"表示减少以下x行的缩进





























